package liuyang.bigeventserver.common;

/**
 * 视频：
 * https://www.bilibili.com/video/BV14z4y1N7pg/?p=22&spm_id_from=pageDriver&vd_source=8bd7b24b38e3e12c558d839b352b32f4
 * 13:35左右
 *
 * 说明；示例性的。
 * 提要
 * 1. set/get/remove
 * 2. 线程安全
 * 3. 用完一定要调用remove清理！！！！
 *
 * @author xconf
 * @since 2024/3/1
 */
public class ThreadLocalUtil {
    private static final ThreadLocal THREAD_LOCAL = new ThreadLocal();

    public static <T> T get() {
        return (T) THREAD_LOCAL.get();
    }

    public static void set(Object value) {
        THREAD_LOCAL.set(value);
    }

    /**
     * 如果不清除，则会造成资源泄露。因为ThreadLocal全局唯一，生命周期与应用本身相同，不随着某个线程的退出而消失。
     * 重要！如果在Interceptor中preHandle中使用ThreadLocal并设置值，则需要在afterCompletion中调用本方法，实现资源释放。
     * 视频：https://www.bilibili.com/video/BV14z4y1N7pg/?p=22&spm_id_from=pageDriver&vd_source=8bd7b24b38e3e12c558d839b352b32f4
     * 16:56左右。
     */
    public static void remove() {
        THREAD_LOCAL.remove();
    }
}
